package dbtools;
/**
 * Title: 查询结果集管理类(精简类)
 * Desc :
 */
import dbtools.DBQuery;

import java.util.ArrayList;
import java.util.HashMap;

public class DataSimpDto
{

    private ArrayList arraydata; //存储数据

    /**
     * 初始化
     * @param :ArrayList 结果集
     */
    public DataSimpDto(ArrayList newvec)
    {
        arraydata = newvec;
    }
    /**
     * 初始化(适用于当前使用主数据库之外的数据库)
     * @param :String SQL查询语句
     */
    public DataSimpDto(String dbname, String sql)
    {
        if (dbname.equals(""))
        {
            arraydata = DBQuery.makeQuery(sql);
        }
        else
        {
            arraydata = DBQueryOthe.makeQuery(dbname, sql);
        }
        if (arraydata == null)
        {
            arraydata = new ArrayList();
            String tmparr[] = { "nullerror" };
            arraydata.add(tmparr);

        }
    }
    /**
     * 初始化
     * @param :String SQL查询语句
     */
    public DataSimpDto(String sql)
    {
	        arraydata = DBQuery.makeQuery(sql);
	        if (arraydata == null)
	        {
		            arraydata = new ArrayList();
		            String tmparr[] = { "nullerror" };
		            arraydata.add(tmparr);
	        }
    }
    /**
     * 初始化(目前没有限制提取条数)
     * @param :String SQL查询语句
     * @param :int    提取的记录条数
     */
    public DataSimpDto(String sql, int recnum)
    {
	        arraydata = DBQuery.makeQuery(sql, recnum);
	        if (arraydata == null)
	        {
		            arraydata = new ArrayList();
		            String tmparr[] = { "nullerror" };
		            arraydata.add(tmparr);
	        }
    }
    /**
     * 初始化(限制提取条数)
     * @param :String SQL查询语句
     * @param :int    提取的记录条数
     * @param :sign   提取的标记位
     */
    public DataSimpDto(String sql, int recnum, String sign)
    {
	        String newsql = "select * from "
							        +"(select my_table.*,rownum as my_rownum from("
							        + sql
							        + ") my_table) where my_rownum>=0 and my_rownum<="
							        + recnum;

            newsql = sql + " limit 0," + recnum;

	        arraydata = DBQuery.makeQuery(newsql, recnum);
	        if (arraydata == null)
	        {
		            arraydata = new ArrayList();
		            String tmparr[] = { "nullerror" };
		            arraydata.add(tmparr);
	        }
    }
    /**
     * 初始化--指定记录条数
     * @param :String SQL查询语句
     * @param :int    提取的记录条数
     */
    public DataSimpDto(String dbname, String sql, int recnum)
    {
	        if (dbname.equals(""))
	        {
	            	arraydata = DBQuery.makeQuery(sql, recnum);
	        }
	        else
	        {
	        		arraydata = DBQueryOthe.makeQuery(dbname, sql, recnum);
	        }
	        if (arraydata == null)
	        {
		            arraydata = new ArrayList();
		            String tmparr[] = { "nullerror" };
		            arraydata.add(tmparr);
	        }
    }

    /**
     * 是否为空
     */
    public boolean isNull()
    {
	        if (arraydata == null)
	        {
	        		return true;
	        }
	        else
	        {
		            String[] tmptrr = (String[]) arraydata.get(0);
		            if (((String) tmptrr[0]).equals("nullerror"))
		            {
		                	return true;
		            }
		            return false;
	        }
    }

    /**
     * 清空数据
     */
    public DataSimpDto()
    {
        	arraydata = new ArrayList();
    }
    public final void clear()
    {
        	arraydata = new ArrayList();
    }
    /**
     * 返回查询数据集
     */
    public final ArrayList getDataDto()
    {
        	return arraydata;
    }
    /**
     * 更新数据集
     */
    public final  void setDataDto(ArrayList datas)
    {
       		this.arraydata = datas;
    }
    /**
     * 得到结果集总字段数
     * @return (int) retint 总字段数
     */
    public final int getTotField()
    {
        String[] tmpstr = (String[]) arraydata.get(0);
        return tmpstr.length;
    }
    /**
     * 得到结果集总记录数
     * @return (int) retint 总记录数
     */
    public final int getTotRecord()
    {
        return arraydata.size() - 1;
    }
    /**
     * 得到字段名称
     * @param int  第 N 个字段
     * @return (String)
     */
    public final String getFieldName(int n)
    {
        String[] tmpstr = (String[]) arraydata.get(0);
        return tmpstr[n];
    }
    /**
     * 得到字段物理名称
     * @param int  第 N 个字段
     * @return (String)
     */
    public final String getPhysicalName(int n)
    {
//        String[] tmpstr = (String[]) arraydata.get(1);
//        return tmpstr[n];
    		return "";
    }
    /**
     * 得到结果集某一字段 第 n 条记录的值
     *
     * @param  (String) numbername 字段名  小写
     * @param  (int)    recordno  第几条记录  从 0 开始
     * @return (String) retstr 返回的记录值
     *
     */
    public final String getDataValue(String name, int recordno)
    {
        return DataDtoSupclass.getDataValue(arraydata, name, recordno);
    }
    /**
     * 得到结果集日期格式某一字段 第 n 条记录的值
     *
     * @param  (String) numbername 字段名  小写
     * @param  (int)    recordno  第几条记录  从 0 开始
     * @return (String) retstr 返回的记录值
     *
     */
    public final String getDateValue(String name, int recordno)
    {
        String rqstr =
            DataDtoSupclass.getDataValue(arraydata, name, recordno).trim();
        if (rqstr.equals(""))
            return rqstr;

        return StaticTools.tostanddate(rqstr);
    }
    /**
     * 得到结果集某一字段 第 n 条记录的值
     *
     * @param  (String) numbername 字段名  小写
     * @param  (int)    recordno  第几条记录  从 0 开始
     * @return (String) retstr 返回的记录值
     *
     */
    public final String getNumValue(String name, int recordno)
    {
        String nowvalue =
            DataDtoSupclass.getDataValue(arraydata, name, recordno);
        if (nowvalue.equals(""))
        {
            nowvalue = "0";
        }
        return nowvalue;
    }
    /**
     * 得到结果集第N个字段 第 n 条记录的值
     *
     * @param  (int) 第N个字段
     * @param  (int) recordno  第几条记录  从 0 开始
     * @return (String) retstr 返回的记录值
     *
     */
    public final String getDataValue(int fieldno, int recordno)
    {
        return DataDtoSupclass.getDataValue(arraydata, fieldno, recordno);
    }

    /**
     * 得到按某个字段进行分组索引数据
     *
     * @param  (String) 分组字段名称
     * @return (String) data 数据集
     *
     */
    public final HashMap getDataIndex(String name)
    {
        HashMap data = new HashMap();
        if (getTotRecord() > 0)
        {
            for (int i = 0; i < getTotRecord(); i++)
            {
                String value = getDataValue(name, i);
                if (data.containsKey(value))
                {
                    ArrayList indexArry = (ArrayList) data.get(value);
                    indexArry.add("" + i);
                    data.put(value, indexArry);
                }
                else
                {
                    ArrayList indexArry = new ArrayList();
                    indexArry.add("" + i);
                    data.put(value, indexArry);
                }
            }
        }
        return data;
    }
    /**
     * 给结果集某一字段 第 n 条记录赋值
     *
     * @param  (String) numbername 字段名  小写
     * @param  (int)    recordno  第几条记录  从 0 开始
     * @param  (String) 新值
     *
     */
    public final void setDataValue(
        String name,
        int recordno,
        String newvalue)
    {
        String[] tmparr = (String[]) arraydata.get(0);

        this.arraydata =
            DataDtoSupclass.setDataValue(arraydata, name, recordno, newvalue);
    }

    public final void setDataValue(
        int fieldno,
        int recordno,
        String newvalue)
    {
        this.arraydata =
            DataDtoSupclass.setDataValue(
                arraydata,
                fieldno,
                recordno,
                newvalue);
    }
    /**
     * 初始化--依据KEY值 提取数据
     * @param :String SQL查询语句
     */
    public DataSimpDto(
        String selectsql,
        String fromSql,
        String searWhere,
        String searOrder,
        String groutpSql,
        String withSql,
        String kyename,
        String keyvalue)
    {
        String sql =
            makeStandSql(
                selectsql,
                fromSql,
                searWhere,
                searOrder,
                groutpSql,
                withSql,
                kyename,
                keyvalue);
        arraydata = DBQuery.makeQuery(sql);
        if (arraydata == null)
        {
            arraydata = new ArrayList();
            String tmparr[] = { "nullerror" };
            arraydata.add(tmparr);
        }
    }
    /**
     * 初始化--记录行数 提取数据
     * @param :String SQL查询语句
     */
    public DataSimpDto(
        String selectsql,
        String fromSql,
        String searWhere,
        String searOrder,
        String groutpSql,
        String withSql,
        int num)
    {
        String sql =
            makeStandSql(
                selectsql,
                fromSql,
                searWhere,
                searOrder,
                groutpSql,
                withSql,
                num);
        arraydata = DBQuery.makeQuery(sql);
        if (arraydata == null)
        {
            arraydata = new ArrayList();
            String tmparr[] = { "nullerror" };
            arraydata.add(tmparr);
        }
    }
    private String makeStandSql(
        String selectsql,
        String fromSql,
        String searWhere,
        String searOrder,
        String groupSql,
        String withSql,
        int num)
    {
        String retsql =
            intiQuerySQL(
                withSql + selectsql,
                fromSql,
                searWhere,
                searOrder,
                groupSql,
                num);
        return retsql;
    }
    private String makeStandSql(
        String selectsql,
        String fromSql,
        String searWhere,
        String searOrder,
        String groupSql,
        String withSql,
        String keyname,
        String keyvalue)
    {
        String retsql =
            intiQuerySQL(
                withSql + selectsql,
                fromSql,
                searWhere,
                searOrder,
                keyname,
                keyvalue,
                groupSql);
        return retsql;
    }
    private String intiQuerySQL(
        String sql,
        String fromsql,
        String wheresql,
        String orderSql,
        String currKeyName,
        String currKeyValue,
        String groupsql)
    {
        StringBuffer querySQL = new StringBuffer();
        sql = sql.toLowerCase();

 /*       querySQL.append("select * from ")
				        .append("(select my_table.*,rownum as my_rownum ")
				        .append("from(")
				        .append(sql+ " "+ fromsql+ " "+ wheresql+ " "+ groupsql+ " "+ orderSql)
				        .append(") my_table ")
				        .append(") where " + currKeyName + "='" + currKeyValue + "'");*/

        if (!wheresql.trim().equals("")) {
            wheresql += " and ";
        }
        wheresql += currKeyName + "='" + currKeyValue;
        querySQL.append(sql + " " + fromsql + " " + wheresql + " "
                + groupsql + " " + orderSql);

        return querySQL.toString();
    }
    private String intiQuerySQL(
        String sql,
        String fromsql,
        String wheresql,
        String orderSql,
        String groupsql,
        int startIndex)
    {
        StringBuffer querySQL = new StringBuffer();
        int totrow = 1 + startIndex;
/*        querySQL.append("select * from ")
				        .append("(select my_table.*,rownum as my_rownum ")
				        .append("from ( ")
				        .append( sql + " " + fromsql + " " + wheresql + " " + groupsql + " " + orderSql)
				        .append(") my_table ")
				        .append(") where my_rownum>=")
				        .append(startIndex + " and my_rownum<" + totrow);*/


        querySQL.append(
                sql + " " + fromsql + " " + wheresql + " " + groupsql + " "
                        + orderSql).append(
                "limit " + startIndex + "," + totrow);
        return querySQL.toString();
    }

}
